package com.link.base.base.mpconfig.service;


import com.link.base.base.mpconfig.dao.mybatis.mapper.MpInnerMenuMapper;
import com.link.base.base.mpconfig.dao.mybatis.mapper.MpMapper;
import com.link.base.base.mpconfig.model.Mp;
import com.link.base.base.mpconfig.model.MpInnerMenu;
import com.link.core.cllog.LCLogger;
import com.link.core.basic.dao.mapper.BasicMapper;
import com.link.core.basic.service.ServiceException;
import com.link.core.basic.service.BasicServiceImpl;
import com.link.core.util.JsonUtil;
import com.link.core.util.RedisUtil;
import com.link.core.util.StringUtils;
import com.link.core.util.UserUtil;
import com.link.core.util.redisclient.LinkRedisClient;
import org.springframework.stereotype.Service;


import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 闫有霞
 * created: 2018-11-19
 * comments: 小程序配置信息
 */

@Service
public class MpServiceImpl extends BasicServiceImpl<Mp> implements MpService {

    @Resource
    private MpMapper mpMapper;

    @Resource
    private MpInnerMenuMapper mpInnerMenuMapper;

    @Override
    public BasicMapper<Mp> getBasicMapper() {
        return mpMapper;
    }

    /**
     * 根据配置的加密id,获取配置信息
     * @author LiQun
     * @date 2018/11/19
     * @param entity 小程序信息
     * @return 返回查询到的小程序信息
     * @throws Exception 异常信息
     */
    @Override
    public Mp queryMpInfoByEncryptionId(Mp entity) throws Exception {
        LinkRedisClient jedis = RedisUtil.getJedis();
        Mp result = null;
        try {
            // 获取配置信息
            String appEncryptionId = entity.getAppEncryptionId();
            // 从redis中获取配置信息
            String mpConfigStr = jedis.get("MP_CONFIG_" + appEncryptionId);
            // 如果取出的配置信息未空
            if (StringUtils.isBlank(mpConfigStr)) {
                // 则从数据库中获取信息
                // 调用分页查询
                List<Mp> list = queryByExamplePage(entity);
                // 获取第一个查到的配置信息,默认情况下是不允许出现多个配置使用相同的appEncryptionId
                if (list != null && list.size() > 0) {
                    // 获取结果,并将配置信息存入redis
                    result = list.get(0);
                    jedis.set("MP_CONFIG_" + appEncryptionId, JsonUtil.toString(result));
                } else {
                    throw new ServiceException("MPCONFIG-001");
                }
            } else {
                // 存在配置信息,将配置信息进行转换
                result = JsonUtil.fromJsonStringToT(mpConfigStr, Mp.class);
            }
        } catch (Exception e) {
            throw new ServiceException("MPCONFIG-001");
        } finally {
            RedisUtil.returnResource(jedis);
        }
        return result;
    }


    /**
     *@createdBy 闫有霞
     *@date 2018/11/30
     *@methods: setMianFlag
     *@param: mp
     *@return: void
     *@description: 更新数据根据ID进行将其他的设为非主要的
     **/
    @Override
    public void updateMainFlag(Mp mp) throws Exception {
        mpMapper.updateMainFlag(mp);
    }

    /**
     * @createdBy 闫有霞
     * @date 2018/12/1
     * @methods: setMainFlag
     * @param: Mp mp
     * @return: void
     * @description: 设为主要的 保证有且仅有一个主要记录
     **/
    @Override
    public void setMainFlag(Mp mp) throws Exception {
        List<Mp>  mpList = new ArrayList<Mp>();
        /*查询所有-》遍历*/
        mpList = mpMapper.queryAll(mp);
        if ( mpList.size() > 0) {
            for ( Mp item : mpList) {
                /*判断要设为主要的记录ID 与 数据库 中 记录 匹配
                * —》 将主要 （mainFlag='Y'）
                * 及 有效 （validFlag='Y'） */
                if ( mp.getId().equals(item.getId())) {
                    item.setMainFlag("Y");
                    item.setValidFlag("Y");
                    mpMapper.updateMainFlag(item);
                } else {
                    /*判断要设为主要的记录ID 与 数据库 中 记录 不匹配
                     * —》 将主要 （mainFlag='N'）
                      */
                    item.setMainFlag("N");
                    mpMapper.updateMainFlag(item);
                }
            }

        }

    }

    /**
     * 查询当前小程序对应的客服电话
     * @author KuangRuifeng
     * @date 2018年12月14日
     * @return 电话
     * @throws Exception 异常信息
     */
    @Override
    public String queryCostomPhone() throws Exception {
        // 获取当前用户的appId
        String appId = UserUtil.getUser().getMpAppId();
        Mp mp = new Mp();
        mp.setAppEncryptionId(appId);
        mp.setPageFlag(false);
        List<Mp> mpList = this.queryByExamplePage(mp);
        if (mpList.size() > 0) {
            // 一个appId只对应一条记录
            String costomPhone = mpList.get(0).getCostomPhone();
            if (StringUtils.isBlank(costomPhone)) {
                throw new ServiceException("MPCONFIG-002");
            }
            return costomPhone;
        } else {
            throw new ServiceException("MPCONFIG-003");
        }
    }

    @Override
    public List<MpInnerMenu> queryMenuByMpId(Long mpId) throws Exception {
        MpInnerMenu mpInnerMenu = new MpInnerMenu();
        mpInnerMenu.setMpId(mpId);
        mpInnerMenu.setMenuGrade("0");
        /*查询该小程序下的一级菜单*/
        List<MpInnerMenu> mpMenu = mpInnerMenuMapper.queryAll(mpInnerMenu);
        /*遍历一级菜单*/
        if (mpMenu.size() > 0) {
            for (MpInnerMenu item : mpMenu) {
                MpInnerMenu subMenu = new MpInnerMenu();
                subMenu.setMpId(mpId);
                subMenu.setMenuGrade("1");
                subMenu.setParentMenuId(item.getMpMenuId());
                /*查询一级菜单对应的二级菜单*/
                item.setSubMenuList(mpInnerMenuMapper.queryAll(subMenu));
            }
        }

        return mpMenu;
    }

    @Override
    public Mp queryMpInfoByAppId(Mp entity) throws Exception {
        // 调用分页查询
        List<Mp> list = queryByExamplePage(entity);
        Mp result = null;
        // 获取第一个查到的配置信息,默认情况下是不允许出现多个配置使用相同的appEncryptionId
        if (list != null && list.size() > 0) {
            result = list.get(0);
        } else {
            throw new ServiceException("MPCONFIG-001");
        }
        return result;
    }

    /**
     * @createdBy 闫有霞
     * @date 2018/12/25
     * @methods: updateLeaveInfoFlag
     * @param:
     * @return:
     * @description: 更新是否强制留资
     **/

    @Override
    public void updateLeaveInfoFlag(Mp mp) throws Exception {
        mpMapper.updateLeaveInfoFlag(mp);
    }

    @Override
    public void updateShareFriendFlag(Mp mp) throws Exception {
        mpMapper.updateShareFriendFlag(mp);
    }

    /**
     * 重写update方法
     * @author LiQun
     * @date 2019/2/19
     */
    @Override
    public void update(Mp entity) throws Exception {
        // 更新数据
        super.update(entity);
        // 将更新的数据写入到redis中去
        LinkRedisClient jedis = RedisUtil.getJedis();
        try {
            entity = this.queryById(entity);
            jedis.set("MP_CONFIG_" + entity.getAppEncryptionId(), JsonUtil.toString(entity));
        } catch (Exception e) {
            LCLogger.withException(e);
        } finally {
            if (jedis != null) {
                RedisUtil.returnResource(jedis);
            }
        }
    }
}

